package com.heima.user.service.impl;

import com.alibaba.nacos.api.utils.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojo.ApUser;
import com.heima.user.mapper.ApUserMapper;
import com.heima.user.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.HashMap;

@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {

    /**
     * 登录接口
     *   二合一，用户登录也是有游客登录
     * @param dto
     * @return
     */
    @Override
    public ResponseResult login(LoginDto dto) {
        //正常登录(手机号+密码登录)
        if(!StringUtils.isBlank(dto.getPhone()) && !StringUtils.isBlank(dto.getPassword()) ){
            // 1.1 查询用户信息
            ApUser apUser = getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
            if (apUser == null ){
                return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST, "用户不存在");
            }

            // 1.2 对比密码，这里你的逻辑是直接前端传过来的值与数据库中的password进行判断，肯定错误，正确流程为下面的
            //首先获取数据库中的salt字段，这个代表研制，然后与前端的密码进行合并，md5加密之后获取的密码与数据库的password进行对比
//            if (!apUser.getPassword().equals(dto.getPassword())){
//                return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
//            }

            //这里才是正常的密码加密之后的判断逻辑
            //获取数据库中的salt字段，这个代表的是盐值
            String salt = apUser.getSalt();
            //获取前端传过来的密码
            String password = dto.getPassword();
            //两者拼接进行md5加密，得到加密后的密码
            String mded = DigestUtils.md5DigestAsHex((password+salt).getBytes());
            System.out.println(mded+"这个是拼接后进行md5加密后的密码");
            System.out.println(apUser.getPassword()+"这个是数据库中password的密码，两者进行判断");
            if (!apUser.getPassword().equals(mded)){
                //如果两者不一样，则抛出异常信息，可以ctrl点击AppHttpCodeEnum.LOGIN_PASSWORD_ERROR查看里面对应异常信息
                return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);
            }
            //如果密码匹配，则返回用户信息，这里返回的是一个map集合，里面有token和用户信息，进行下一步逻辑



            // 1.3 返回用户信息
            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("token" , AppJwtUtil.getToken(apUser.getId().longValue()));
            apUser.setPassword("");
            hashMap.put("user" , apUser);
            return ResponseResult.okResult(hashMap);
        }else {
            // 游客登录 同样返回TOken id == 0
            HashMap<String, Object> map = new HashMap<>();
            map.put("token", AppJwtUtil.getToken(0L));
            return ResponseResult.okResult(map);
        }

        //游客登录
    }

    public static void main(String[] args) {
        String s = "123";
        String password = "suwukong";
        String s1 = DigestUtils.md5DigestAsHex((password + s).getBytes());
        System.out.println(s1);
    }

    /**
     * 根据用户id获取用户实体
     *
     * @param userId
     * @return
     */
    @Override
    public ResponseResult<ApUser>findUserById(Integer userId) {
        ApUser apUser = getById(userId);
        return ResponseResult.okResult(apUser);
    }
}
